<?php

/**
 * JPGraph v4.0.3
 */

namespace lemon\JpGraph\Graph;

use lemon\JpGraph\Text;
use lemon\JpGraph\Util;

/**
 * @class Axis
 * // Description: Defines X and Y axis. Notes that at the
 * // moment the code is not really good since the axis on
 * // several occasion must know wheter it's an X or Y axis.
 * // This was a design decision to make the code easier to
 * // follow.
 */
class AxisPrototype
{
	public $scale;
	public $img;
	public $hide		= false;
	public $hide_labels = false;
	public $title;
	public $font_family = FF_DEFAULT;
	public $font_style  = FS_NORMAL;
	public $font_size   = 8;
	public $label_angle = 0;
	public $tick_step   = 1;
	public $pos		 = false;
	public $ticks_label = [];

	protected $weight	  = 1;
	protected $color	   = [0, 0, 0];
	protected $label_color = [0, 0, 0];
	protected $ticks_label_colors;
	protected $show_first_label = true;
	protected $show_last_label  = true;
	protected $label_step	   = 1; // Used by a text axis to specify what multiple of major steps
	// should be labeled.
	protected $labelPos = 0; // Which side of the axis should the labels be?
	protected $title_adjust;
	protected $title_margin;
	protected $title_side		= SIDE_LEFT;
	protected $tick_label_margin = 5;
	protected $label_halign	  = '';
	protected $label_valign	  = '';
	protected $label_para_align  = 'left';
	protected $hide_line		 = false;
	protected $iDeltaAbsPos	  = 0;

	public function __construct($img, $aScale, $color = [0, 0, 0]){
		$this->img   = $img;
		$this->scale = $aScale;
		$this->color = $color;
		$this->title = new Text\Text('');

		if ($aScale->type == 'y') {
			$this->title_margin = 25;
			$this->title_adjust = 'middle';
			$this->title->SetOrientation(90);
			$this->tick_label_margin = 7;
			$this->labelPos		  = SIDE_LEFT;
		} else {
			$this->title_margin = 5;
			$this->title_adjust = 'high';
			$this->title->SetOrientation(0);
			$this->tick_label_margin = 5;
			$this->labelPos		  = SIDE_DOWN;
			$this->title_side		= SIDE_DOWN;
		}
	}

	public function SetLabelFormat($aFormStr){
		$this->scale->ticks->SetLabelFormat($aFormStr);
	}

	public function SetLabelFormatString($aFormStr, $aDate = false){
		$this->scale->ticks->SetLabelFormat($aFormStr, $aDate);
	}

	public function SetLabelFormatCallback($aFuncName){
		$this->scale->ticks->SetFormatCallback($aFuncName);
	}

	public function SetLabelAlign($aHAlign, $aVAlign = 'top', $aParagraphAlign = 'left'){
		$this->label_halign	 = $aHAlign;
		$this->label_valign	 = $aVAlign;
		$this->label_para_align = $aParagraphAlign;
	}

	// Don't display the first label
	public function HideFirstTickLabel($aShow = false){
		$this->show_first_label = $aShow;
	}

	public function HideLastTickLabel($aShow = false){
		$this->show_last_label = $aShow;
	}

	// Manually specify the major and (optional) minor tick position and labels
	public function SetTickPositions($aMajPos, $aMinPos = null, $aLabels = null){
		$this->scale->ticks->SetTickPositions($aMajPos, $aMinPos, $aLabels);
	}

	// Manually specify major tick positions and optional labels
	public function SetMajTickPositions($aMajPos, $aLabels = null){
		$this->scale->ticks->SetTickPositions($aMajPos, null, $aLabels);
	}

	// Hide minor or major tick marks
	public function HideTicks($aHideMinor = true, $aHideMajor = true){
		$this->scale->ticks->SupressMinorTickMarks($aHideMinor);
		$this->scale->ticks->SupressTickMarks($aHideMajor);
	}

	// Hide zero label
	public function HideZeroLabel($aFlag = true){
		$this->scale->ticks->SupressZeroLabel();
	}

	public function HideFirstLastLabel(){
		// The two first calls to ticks method will supress
		// automatically generated scale values. However, that
		// will not affect manually specified value, e.g text-scales.
		// therefor we also make a kludge here to supress manually
		// specified scale labels.
		$this->scale->ticks->SupressLast();
		$this->scale->ticks->SupressFirst();
		$this->show_first_label = false;
		$this->show_last_label  = false;
	}

	// Hide the axis
	public function Hide($aHide = true){
		$this->hide = $aHide;
	}

	// Hide the actual axis-line, but still print the labels
	public function HideLine($aHide = true){
		$this->hide_line = $aHide;
	}

	public function HideLabels($aHide = true){
		$this->hide_labels = $aHide;
	}

	// Weight of axis
	public function SetWeight($aWeight){
		$this->weight = $aWeight;
	}

	// Axis color
	public function SetColor($aColor, $aLabelColor = false){
		$this->color = $aColor;
		if (!$aLabelColor) {
			$this->label_color = $aColor;
		} else {
			$this->label_color = $aLabelColor;
		}
	}

	// Title on axis
	public function SetTitle($aTitle, $aAdjustAlign = 'high'){
		$this->title->Set($aTitle);
		$this->title_adjust = $aAdjustAlign;
	}

	// Specify distance from the axis
	public function SetTitleMargin($aMargin){
		$this->title_margin = $aMargin;
	}

	// Which side of the axis should the axis title be?
	public function SetTitleSide($aSideOfAxis){
		$this->title_side = $aSideOfAxis;
	}

	public function SetTickSide($aDir){
		$this->scale->ticks->SetSide($aDir);
	}

	public function SetTickSize($aMajSize, $aMinSize = 3){
		$this->scale->ticks->SetSize($aMajSize, $aMinSize = 3);
	}

	// Specify text labels for the ticks. One label for each data point
	public function SetTickLabels($aLabelArray, $aLabelColorArray = null){
		$this->ticks_label		= $aLabelArray;
		$this->ticks_label_colors = $aLabelColorArray;
	}

	public function SetLabelMargin($aMargin){
		$this->tick_label_margin = $aMargin;
	}

	// Specify that every $step of the ticks should be displayed starting
	// at $start
	public function SetTextTickInterval($aStep, $aStart = 0){
		$this->scale->ticks->SetTextLabelStart($aStart);
		$this->tick_step = $aStep;
	}

	// Specify that every $step tick mark should have a label
	// should be displayed starting
	public function SetTextLabelInterval($aStep){
		if ($aStep < 1) {
			Util\JpGraphError::RaiseL(25058); //(" Text label interval must be specified >= 1.");
		}
		$this->label_step = $aStep;
	}

	public function SetLabelSide($aSidePos){
		$this->labelPos = $aSidePos;
	}

	// Set the font
	public function SetFont($aFamily, $aStyle = FS_NORMAL, $aSize = 10){
		$this->font_family = $aFamily;
		$this->font_style  = $aStyle;
		$this->font_size   = $aSize;
	}

	// Position for axis line on the "other" scale
	public function SetPos($aPosOnOtherScale){
		$this->pos = $aPosOnOtherScale;
	}

	// Set the position of the axis to be X-pixels delta to the right
	// of the max X-position (used to position the multiple Y-axis)
	public function SetPosAbsDelta($aDelta){
		$this->iDeltaAbsPos = $aDelta;
	}

	// Specify the angle for the tick labels
	public function SetLabelAngle($aAngle){
		$this->label_angle = $aAngle;
	}
} // @class
